package com._001_Java连接数据库;

import java.sql.*;

public class Demo {
    /**
     * 1.什么是JDBC？
     * 2.怎么用？
     * 3.连接与调用原理是什么？
     * <p>
     * JDBC java数据库连接（Java Data Base Connectivity）
     * JDBC是一种用于执行SQL语句的Java API，它是Java十三个规范之一，由一组用Java语言编写的类和接口组成。
     * JDBC提供了一种基准，据此可以通过代码更高级的接口或工具，使开发人员能够编写数据库应用程序，同时，JDBC也是个商标名。
     * <p>
     * ODBC 开放数据库互连（Open Database Connectivity）
     * 是微软公司开放服务结构（WOSA，Windows Open Services Architecture）中有关数据库的一个组成部分，
     * 它建立了一组规范，并提供了一组对数据库访问的标准API（应用程序编程接口）。这些API利用SQL来完成其大部分任务。
     * ODBC本身也提供了对SQL语言的支持，用户可以直接将SQL语句送给ODBC。开放数据库互连（ODBC）是Microsoft提出的数据库访问接口标准。
     * 开放数据库互连定义了访问数据库API的一个规范，这些API独立于不同厂商的DBMS，也独立于具体的编程语言（但是Microsoft的ODBC文档是用C语言描述的，
     * 许多实际的ODBC驱动程序也是用C语言写的。）ODBC规范后来被X/OPEN和ISO/IEC采纳，作为SQL标准的一部分，具体内容可以参看《ISO/IEC 9075-3:1995 (E) Call-Level Interface (SQL/CLI)》等相关的标准文件。
     * <p>
     * 两者之间的联系
     * JDBC和ODBC都是用来连接数据库的启动程序，JDBC和ODBC由于具有数据库独立性甚至平台无关性，因而对Internet上异构数据库的访问提供了很好的支持。
     * <p>
     * 两者之间的区别
     * <p>
     * 1.JDBC比ODBC更容易理解
     * 从事编程工作的朋友都知道Java比C语言更好学，主要是因为Java语言是面向对象的更接近人的思维认识，更容易被人接受。而C语言就较为抽象，
     * 跟人的认识思维相差较大，其开发出来的产品也具有类似特点。在ODBC中一个的简单的查询，也需求分为好几块内容;而在ODBC驱动程序内部再去整合，做一些复杂的操作。
     * 这不仅降低了数据库启动程序的性能，而且也给程序开发者开发实际运用程序带来了确定的负面效果。而JDBC数据库启动程序在设计的时间就包含了大部份基本数据操作功能，为此在编写一些常规的数据库操作语句时，如查询、更新等等，其所需求的源代码比 ODBC要少的多。故从这方面来说，JDBC数据库启动程序要比ODBC简易理解。
     * <p>
     * 2.JDBC数据库驱动程序是面向对象的
     * JDBC完全遵循Java语言的优良特性。通常情况下，只要有Java功能需设计基础的用户都能在最短时间内了解JDBC驱动程序的架构，较量简易上手，
     * 能轻而易举的开发出强悍的数据库实际运用程序。而ODBC的话，由于其内部功能复杂，源代码编写要求高。为此即使是一个的C语言的高手，仍然需求花费不少的时间去了解那个数据库启动程序;在编写源代码的时间，还离不开有关的参考书本。
     * <p>
     * 3.JDBC的移植性要比ODBC要好。
     * 通常情况下，安装完ODBC驱动程序之后，还需求经过确定的配置才能够应用。而不相同的配置在不相同数据库服务器之间不能够通用。也那是说，装一次需求配置一次。
     * 但是JDBC数据库驱动程序则不相同。假如采用JDBC数据库驱动程序的话，则只需要选取适当的 JDBC数据库驱动程序，就不需要额外的配置。在安装过程中，JDBC数据库驱动程序会自己完成有关的配置。为此JDBC的移植性要比ODBC要好。
     * <p>
     * 从ODBC向JDBC过度
     * 也许数据库编程以前采用的是ODBC驱动程序，而假如数据库编程目前需要采用JDBC驱动程序，那么能否出现顺利过渡呢?答案是肯定的。在JDBC驱动程序中有一类叫作JDBC-ODBC桥接启动程序。
     * 这种类别的JDBC数据库驱动程序其底层是经过ODBC驱动程序来连接数据库的。假如原先的实际运用程序是基于ODBC数据库驱动程序的，或者数据库没有帮助对应的JDBC驱动程序，则数据库编程能利用JDBC-ODBC桥接驱动程序来实现。也那是说，桥接驱动程序能利用现有的ODBC驱动程序来存取联系型数据库。为此者不仅能保留先前的开发架构(经过ODBC来存取数据)，还能立即应用Java作为新的开发环境，从而出现ODBC数据库驱动程序到JDBC的顺利转型。
     * <p>
     * 不过在采用这种桥接驱动程序的时间，需求留意几个难点。一是那个桥接驱动程序仍然需要用到ODBC数据库驱动程序。由于桥接驱动程序直接联系的对象是ODBC驱动程序，然后再经过ODBC驱动程序去访问数据库。
     * 为此在客户端必需先安装并配置好ODBC驱动程序。假如采用的是三层式的开发框架，也需求安装ODBC驱动程序。其次，在这种模式下，实际运用程序先调用JDBC，然后再经过JDBC调用ODBC，最后再跟数据库通信。显然其中间多了几个环节。由于其中间环节较量多，但数据访问出现难点的时候，就不太好查难点。这就好像一道水管，假如中间的接口多了的话，则除了漏水的几率就较量高。假如真的除了漏水的话，则查询漏水点的时间也会较量困难。为此笔者以为，采用桥接类别的JDBC驱动程序只是权宜之计。在适当的时间，数据库开发还是需要调整原先的开发架构，全部都转到JDBC驱动程序上来。桥接程序只是为数据库开发争取确定的时间。虽然那个转型过程中的阵痛是较痛的，但确是不可避免的。长痛不如短痛，笔者意见数据库开发还是及早停止过渡为好。并在估计的情况下，把以前的开发架构也停止调整，以采用真正意义上的JDBC驱动程序。
     * <p>
     * JDBC虽然在一定程度上比ODBC操作简单，容易理解。但是世间万物存在即有道理，并不是说JDBC好就所有的情况下都能使用JDBC，两者之间没有好坏之分，只是在特定的情况下能够选取合适的实现方式即可。
     * <p>
     * JDBC连接数据库
     * jdbc：使用Java代码发送sql语句的技术就是jdbc技术。即jdbc是一个接口，用于不同的数据库（oracle、mysql、sqlserver。。）的操作。使用jdbc发送sql语句的前提：
     * 登录数据库服务器（连接数据库服务器）
     */

    // MySQL 8.0 以下版本
    //    static final String JDBC_DRIVER = "com.mysql.jdbc.Driver";//驱动类的类路径
    //    static final String DB_URL = "jdbc:mysql://localhost:3306/db_demo?serverTimezone=Asia/Shanghai&characterEncoding=UTF8&zeroDateTimeBehavior=convertToNull&useUnicode=true&useSSL=false&useTimezone=false&allowPublicKeyRetrieval=true";//数据库的连接地址

    // MySQL 8.0 以上版本
    static final String JDBC_DRIVER = "com.mysql.cj.jdbc.Driver";
    static final String DB_URL = "jdbc:mysql://127.0.0.1:3306/db_demo?serverTimezone=Asia/Shanghai&characterEncoding=UTF8&zeroDateTimeBehavior=convertToNull&useUnicode=true&useSSL=false&useTimezone=false&allowPublicKeyRetrieval=true";

    static final String ACCOUNT = "root";//登录的账号
    static final String PASSWORD = "1234qwer";//登录的密码



    public static void main(String[] args) {

        Connection conn = null;
        Statement stmt = null;
        try {
            // 注册 JDBC 驱动
            Class.forName(JDBC_DRIVER);

            // 打开链接
            System.out.println("连接数据库...");
            conn = DriverManager.getConnection(DB_URL, ACCOUNT, PASSWORD);

            // 执行查询
            System.out.println(" 实例化Statement对象...");
            stmt = conn.createStatement();
            String sql = "SELECT * FROM test1";

            ResultSet rs = stmt.executeQuery(sql);

            // 展开结果集数据库
            while (rs.next()) {
                // 通过字段检索
                int id = rs.getInt("id");
                // 输出数据
                System.out.print("ID: " + id);
                System.out.print("\n");
            }
            // 完成后关闭
            rs.close();
            stmt.close();
            conn.close();
        } catch (Exception se) {
            // 处理 JDBC 错误
            se.printStackTrace();
        }// 处理 Class.forName 错误
        finally {
            // 关闭资源
            try {
                if (stmt != null) stmt.close();
            } catch (SQLException ignored) {
            }// 什么都不做
            try {
                if (conn != null) conn.close();
            } catch (SQLException se) {
                se.printStackTrace();
            }
        }
        System.out.println("完成");

    }
}
